// // 关于保护类型，自己和继承者可用使用
// class Person {
//     constructor(name: string) {
//         this.name = name
//     }
//     protected name:string;
//     public sayHello(){
//         console.log(this.name + 'say Hello')
//     }
// }
// class Teacher extends Person{
//     public sayBye(){
//         console.log(this.name + 'say Bay')
//     }
// }
// const t = new Teacher("lobo")
// t.sayHello()
// t.sayBye()

// // getter 和 setter 封装类中属性的读写
// class Xiaojiejie {
//   constructor(private _age: number) {}
//   get age() {
//     return this._age - 10;
//   }
//   set age(age: number) {
//     this._age = age + 3;
//   }
// }
// const dajiao = new Xiaojiejie(28);
// dajiao.age = 25;
// console.log(dajiao.age);

// // static 挂在类上的static属方上，其子类也可以访问，因为子父类的关系通过__proto__指向的，类似于原型链
// class Girl {
//   static alias: string = "lobo";
//   static sayLove() {
//     return "I Love you";
//   }
// }
// class Baby extends Girl {}
// console.log(Girl.alias);
// console.log(Girl.sayLove());
// console.log(Baby.alias);
// console.log(Baby.sayLove());

// // 关于抽象的类，类继承它后，必须实现抽象类中的方法
// abstract class Person {
//   abstract sayHello(): void;
// }

// class p1 extends Person {
//   sayHello() {
//     console.log("Hello");
//   }
//   sayHi() {
//     console.log("Hi");
//   }
// }

// 关于any和unknown，的区别
// any 完全放弃了类型检查，可以乱来
// unknown 是top type，还具备类型检查

// 下例，any类型不会报错
// 将any2也污染成any
// const any1: any = {};
// let any2: number = any1;
// 对象不具备的属方也不会检查
// const dog: any = {
//   name: "mm",
// };
// dog.sayHi();

// 下例，unknown类型会报错
// unknown类型，只能给到unknown类型和any类型
// const unknown1: unknown = {};
// let unknown2: number = unknown1;
// 对象不具备的属方会检查
// const wolf: unknown = {
//   name: "mm",
// };
// wolf.sayHi();

// interface Waiter {
//   anjiao: boolean;
//   say: () => {};
// }
// interface Teacher {
//   anjiao: boolean;
//   skill: () => {};
// }
// // 联合类型
// function judgeWho1(animal: Waiter | Teacher) {}
// // 交叉类型
// // 同名类型会进行合并，同名基础类型属性的合并返回：never
// // 同名非基础类型属性可以正常合并
// function judgeWho2(jishi: Waiter & Teacher) {}
// judgeWho2({
//   say(): any {
//     console.log("say");
//   },
//   anjiao: false,
//   skill(): any {
//     console.log("skill");
//   },
// });
